home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABUSESRC.ZIP / AbuseSrc / macabuse / inc / netface.hpp < prev    next >
C/C++ Source or Header  |  1997-05-20  |  6KB  |  165 lines

  1. // structure used to comminicate with the engine
  2.  
  3. #ifndef __NETFACE_HPP_
  4. #define __NETFACE_HPP_
  5.  
  6. #ifdef __MAC__
  7. #define PACKET_MAX_SIZE 500    // this is a game data packet (udp/ipx)
  8. #define READ_PACKET_SIZE 500   // this is a file service packet (tcp/spx)
  9. #else
  10. #define PACKET_MAX_SIZE 500    // this is a game data packet (udp/ipx)
  11. #define READ_PACKET_SIZE 500   // this is a file service packet (tcp/spx)
  12. #endif
  13.  
  14. #define NET_CRC_FILENAME "#net_crc"
  15. #define NET_STARTFILE    "netstart.spe"
  16. #include "indian.hpp"
  17. #include <string.h>
  18.  
  19.  
  20. // list of commands for general networking and file services
  21.  
  22. enum { NFCMD_OPEN,
  23.        NFCMD_CLOSE,
  24.        NFCMD_READ,
  25.        NFCMD_WRITE,
  26.        NFCMD_SEEK,
  27.        NFCMD_SIZE,
  28.        NFCMD_TELL,
  29.        NFCMD_SET_FS,            // used to set the default (active) filesever
  30.        NFCMD_CRCS_CALCED,       // engine sends this to driver after crcs are saved
  31.        NFCMD_REQUEST_LSF,       // engine sends to driver with remote server name, returns 0 for failure or lsf name
  32.        NFCMD_PROCESS_LSF,       // remote engine sends to driver with lsf name, when get_lsf is set in base_mem
  33.        NFCMD_REQUEST_ENTRY,     // sent from joining client engine to driver, who then connects as client_abuse
  34.        NFCMD_BECOME_SERVER,
  35.        NFCMD_BLOCK,             // used by UNIX version to have engine give it up it's time-slice  
  36.        NFCMD_RELOAD_START,
  37.        NFCMD_RELOAD_END,
  38.        NFCMD_SEND_INPUT, 
  39.        NFCMD_INPUT_MISSING,     // when engine is waiting for input and suspects packets are missing
  40.        NFCMD_KILL_SLACKERS,     // when the user decides the clients are taking too long to respond
  41.        EGCMD_DIE
  42.      };
  43.  
  44. // client commands
  45. enum { CLCMD_JOIN_FAILED,
  46.        CLCMD_JOIN_SUCCESS,     
  47.        CLCMD_RELOAD_START,           // will you please load netstart.spe
  48.        CLCMD_RELOAD_END,            // netstart.spe has been loaded, please continue
  49.        CLCMD_REQUEST_RESEND,        // input didn't arrive, please resend
  50.        CLCMD_UNJOIN                 // causes server to delete you (addes your delete command to next out packet)
  51.      } ;
  52.        
  53.  
  54. // return codes for NFCMD_OPEN
  55. enum { NF_OPEN_FAILED,
  56.        NF_OPEN_LOCAL_FILE,      // should return path to local file as well
  57.        NF_OPEN_REMOTE_FILE } ;  // returned to engine for a filename
  58.  
  59.  
  60. // types of clients allowed to connect
  61. enum { CLIENT_NFS=50,           // client can read one remote files
  62.        CLIENT_ABUSE,            // waits for entry into a game
  63.        CLIENT_CRC_WAITER,       // client waits for crcs to be saved
  64.        CLIENT_LSF_WAITER        // waits for lsf to be transmitted
  65.        
  66.      } ; 
  67.  
  68. // base->input_state will be one of the following
  69.  
  70. enum { INPUT_COLLECTING,       // waiting for driver to receive input from clients/server
  71.        INPUT_PROCESSING,       // waiting for engine to process input from last tick
  72.        INPUT_RELOAD,           // server is waiting on clients to reload, process game packets, but don't store them
  73.        INPUT_NET_DEAD };       // net driver detected an unrecoverable net error, engine should shut down net services
  74.  
  75.  
  76.  
  77. // the net driver should not use any of these except SCMD_DELETE_CLIENT (0) because
  78. // they are subject to change
  79. enum { 
  80.        SCMD_DELETE_CLIENT,
  81.        SCMD_VIEW_RESIZE,
  82.        SCMD_SET_INPUT,
  83.        SCMD_WEAPON_CHANGE,
  84.        SCMD_END_OF_PACKET,
  85.        SCMD_RELOAD,
  86.        SCMD_KEYPRESS,
  87.        SCMD_KEYRELEASE,
  88.        SCMD_EXT_KEYPRESS,
  89.        SCMD_EXT_KEYRELEASE,
  90.        SCMD_CHAT_KEYPRESS,
  91.        SCMD_SYNC
  92.      };
  93.  
  94.  
  95. struct join_struct
  96. {
  97.   int client_id;
  98.   char name[100];
  99.   join_struct *next;
  100. } ;
  101.  
  102. struct net_packet
  103. {
  104.   unsigned char data[PACKET_MAX_SIZE];
  105.   int packet_prefix_size()                 { return 5; }    // 2 byte size, 2 byte check sum, 1 byte packet order
  106.   unsigned short packet_size()             { unsigned short size=(*(unsigned short *)data); return lstl(size); }
  107.   unsigned char tick_received()            { return data[4]; }  
  108.   void set_tick_received(unsigned char x)  { data[4]=x; }
  109.   unsigned char *packet_data()             { return data+packet_prefix_size(); }
  110.   unsigned short get_checksum()            { unsigned short cs=*((unsigned short *)data+1); return lstl(cs); }
  111.   unsigned short calc_checksum()
  112.   {
  113.     *((unsigned short *)data+1)=0;
  114.     int i,size=packet_prefix_size()+packet_size();
  115.     unsigned char c1=0,c2=0,*p=data;
  116.     for (i=0;i<size;i++,p++)
  117.     {
  118.       c1+=*p;
  119.       c2+=c1;
  120.     }
  121.     unsigned short cs=( (((unsigned short)c1)<<8) | c2);
  122.     *((unsigned short *)data+1)=lstl(cs);
  123.     return cs;
  124.   }
  125.  
  126.  
  127.   void packet_reset()    { set_packet_size(0); }     // 2 bytes for size, 1 byte for tick
  128.   
  129.   void add_to_packet(void *buf, int size) 
  130.   { 
  131.     if (size && size+packet_size()+packet_prefix_size()<PACKET_MAX_SIZE)
  132.     {
  133.       memcpy(data+packet_size()+packet_prefix_size(),buf,size);
  134.       set_packet_size(packet_size()+size);
  135.     }
  136.   }
  137.   void write_byte(unsigned char x) { add_to_packet(&x,1); }
  138.   void write_short(unsigned short x) { x=lstl(x); add_to_packet(&x,2); }
  139.   void write_long(unsigned long x) { x=lltl(x); add_to_packet(&x,4); }
  140.  
  141.   void set_packet_size(unsigned short x) { *((unsigned short *)data)=lstl(x); }
  142.  
  143.  
  144. } ;
  145.  
  146. struct base_memory_struct
  147. {
  148.   net_packet packet,                        // current tick data
  149.              last_packet;                   // last tick data (in case a client misses input, we can resend)
  150.  
  151.   short mem_lock;
  152.   short calc_crcs;
  153.   short get_lsf;
  154.   short wait_reload;
  155.   short need_reload;
  156.   short input_state;            // COLLECTING or PROCESSING
  157.   short current_tick;           // set by engine, used by driver to confirm packet is not left over
  158.   
  159.   join_struct *join_list;
  160. } ;
  161.  
  162.  
  163.  
  164. #endif
  165.